/*----------------------------------------------------------------------------+
*| |
*| Android's Hooker |
*| |
*+---------------------------------------------------------------------------+
*| Copyright (C) 2011 Georges Bossert and Dimitri Kirchner |
*| This program is free software: you can redistribute it and/or modify |
*| it under the terms of the GNU General Public License as published by |
*| the Free Software Foundation, either version 3 of the License, or |
*| (at your option) any later version. |
*| |
*| This program is distributed in the hope that it will be useful, |
*| but WITHOUT ANY WARRANTY; without even the implied warranty of |
*| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
*| GNU General Public License for more details. |
*| |
*| You should have received a copy of the GNU General Public License |
*| along with this program. If not, see <http://www.gnu.org/licenses/>. |
*+---------------------------------------------------------------------------+
*| @url : http://www.amossys.fr |
*| @contact : android-hooker@amossys.fr |
*| @sponsors : Amossys, http://www.amossys.fr |
*+---------------------------------------------------------------------------+
*/
package com.amossys.hooker.hookers;
import java.util.HashMap;
import java.util.Map;
import com.amossys.hooker.SubstrateMain;
import com.amossys.hooker.exceptions.HookerInitializationException;
/**
* @author Georges Bossert
*
*/
public class CryptoHooker extends Hooker {
public static final String NAME = "Crypto";
public CryptoHooker() {
super(CryptoHooker.NAME);
}
@Override
public void attach() {
attachOnCipherClass();
attachOnMACClass();
attachOnMessageDigestClass();
attachOnPBEKeySpecClass();
attachOnKeyStoreClass();
attachOnKeyManagerFactoryClass();
attachOnBase64Class();
}
/**
* Attach on Base64 class
*/
private void attachOnBase64Class() {
Map<String, Integer> methodsToHook = new HashMap<String, Integer>();
methodsToHook.put("decode", 0);
methodsToHook.put("encode", 0);
methodsToHook.put("encodeToString", 0);
try {
hookMethods(null, "android.util.Base64",
methodsToHook);
SubstrateMain.log("hooking android.util.Base64 methods sucessful");
} catch (HookerInitializationException e) {
SubstrateMain.log("hooking android.util.Base64 methods has failed", e);
}
}
/**
* Attach on KeyManagerFactory class
*/
private void attachOnKeyManagerFactoryClass() {
Map<String, Integer> methodsToHook = new HashMap<String, Integer>();
methodsToHook.put("getAlgorithm", 0);
methodsToHook.put("getInstance", 0);
methodsToHook.put("init", 0);
try {
hookMethods(null, "javax.net.ssl.KeyManagerFactory",
methodsToHook);
SubstrateMain.log("hooking javax.net.ssl.KeyManagerFactory methods sucessful");
} catch (HookerInitializationException e) {
SubstrateMain.log("hooking javax.net.ssl.KeyManagerFactory methods has failed", e);
}
}
/**
* Attach on KeyStore class
*/
private void attachOnKeyStoreClass() {
Map<String, Integer> methodsToHook = new HashMap<String, Integer>();
methodsToHook.put("aliases", 0);
methodsToHook.put("getCertificate", 0);
methodsToHook.put("getCertificateChain", 0);
methodsToHook.put("getDefaulType", 0);
methodsToHook.put("getInstance", 0);
methodsToHook.put("getKey", 0);
methodsToHook.put("getProvider", 0);
methodsToHook.put("load", 0);
methodsToHook.put("store", 0);
try {
hookMethods(null, "java.security.KeyStore",
methodsToHook);
SubstrateMain.log("hooking java.security.KeyStore methods sucessful");
} catch (HookerInitializationException e) {
SubstrateMain.log("hooking java.security.KeyStore methods has failed", e);
}
}
/**
* Attach on Cipher class
*/
private void attachOnCipherClass() {
Map<String, Integer> methodsToHook = new HashMap<String, Integer>();
methodsToHook.put("init", 0);
methodsToHook.put("update", 0);
methodsToHook.put("getInstance", 0);
methodsToHook.put("doFinal", 0);
methodsToHook.put("Random", 0);
methodsToHook.put("getIV", 0);
try {
hookMethods(null, "javax.crypto.Cipher",
methodsToHook);
SubstrateMain.log("hooking javax.crypto.Cipher methods sucessful");
} catch (HookerInitializationException e) {
SubstrateMain.log("hooking javax.crypto.Cipher methods has failed", e);
}
}
/**
* Attach on MAC class
*/
private void attachOnMACClass() {
Map<String, Integer> methodsToHook = new HashMap<String, Integer>();
methodsToHook.put("init", 0);
methodsToHook.put("update", 0);
methodsToHook.put("getInstance", 0);
try {
hookMethods(null, "javax.crypto.Mac",
methodsToHook);
SubstrateMain.log("hooking javax.crypto.Mac methods sucessful");
} catch (HookerInitializationException e) {
SubstrateMain.log("hooking javax.crypto.Mac methods has failed", e);
}
}
/**
* Attach on MessageDigest class
*/
private void attachOnMessageDigestClass() {
Map<String, Integer> methodsToHook = new HashMap<String, Integer>();
methodsToHook.put("update", 0);
methodsToHook.put("getInstance", 0);
methodsToHook.put("digest", 0);
try {
hookMethods(null, "java.security.MessageDigest",
methodsToHook);
SubstrateMain.log("hooking java.security.MessageDigest methods sucessful");
} catch (HookerInitializationException e) {
SubstrateMain.log("hooking java.security.MessageDigest methods has failed", e);
}
}
/**
* Attach on PBEKeySpec class
*/
private void attachOnPBEKeySpecClass() {
Map<String, Integer> methodsToHook = new HashMap<String, Integer>();
methodsToHook.put("PBEKeySpec", 0);
try {
hookMethods(null, "javax.crypto.spec.PBEKeySpec",
methodsToHook);
SubstrateMain.log("hooking javax.crypto.spec.PBEKeySpec methods sucessful");
} catch (HookerInitializationException e) {
SubstrateMain.log("hooking javax.crypto.spec.PBEKeySpec methods has failed", e);
}
}
}